package com.zkthink.ceres.product.service;

import com.zkthink.base.R;
import com.zkthink.base.service.SuperService;
import com.zkthink.ceres.product.dto.*;
import com.zkthink.ceres.product.entity.Product;
import com.zkthink.ceres.product.entity.ProductGroup;
import com.zkthink.ceres.product.entity.SearchHistory;
import com.zkthink.ceres.product.entity.TenantProduct;
import com.zkthink.ceres.product.vo.*;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * <p>
 * 业务接口
 * 商品表
 * </p>
 *
 * @author JustArgo
 * @date 2020-05-03
 */
public interface ProductService extends SuperService<Product> {
    /** 保存商品
     * @author JustArgo 2020/5/6 19:47
     * @return
     */
    R<Boolean> saveProduct(ProductCombineDTO dto);

    /** 更新商品
     * @author JustArgo 2020/5/6 19:47
     * @return
     */
    R<Boolean> updateProduct(ProductCombineDTO dto);

    /**
     * 上架商品
     * @param dto
     * @return
     */
    R<Boolean> onlineProduct(ProductUpdateDTO dto);

    /** 下架商品
     * @author JustArgo 2020/5/9 11:53
     * @return
     */
    R<Boolean> offlineProduct(ProductUpdateDTO dto);

    /** 删除商品
     * @author JustArgo 2020/5/9 11:53
     * @return
     */
    R<Boolean> delProduct(IdQueryDTO dto);

    /** 根据id查询商品
     * @author JustArgo 2020/5/10 17:50
     * @return
     */
    R<ProductCombineDTO> queryById(Long id);

    /** 查询商详
     * @author JustArgo 2020/5/11 18:53
     * @return
     */
    R<ProductVO> queryProductDetail(Long id);

    /** 查询出带有商户编号的商品信息
     * @author JustArgo 2020/5/12 9:17
     * @return
     */
    TenantProduct getByIdWithTenant(Long id);

    /** 管理后台查询商品列表
     * @author JustArgo 2020/5/14 12:27
     * @return
     */
    R<AdminProductPageVO> findAdminProductList(AdminProductDTO dto);

    /** 根据购物车的skuId列表组装成 店铺对应的商品
     * @author JustArgo 2020/5/18 22:41
     * @return
     */
    R<List<ShoppingCartSkuVO>> assembleShoppingCartSku(List<Long> skuIdList);

    /** 搜索商品
     * @author JustArgo 2020/5/19 22:36
     * @return
     */
    R<ProductPageVO> searchProduct(SearchProductDTO searchProductDTO);

    /** 统计商品的库存
     * @author JustArgo 2020/5/23 20:02
     * @return
     */
    void updateStock(Set<Long> productIdSet);

    /** 根据商品选中的规格，查询sku信息
     * @author JustArgo 2020/5/25 21:12
     * @return
     */
    R<ProductSkuVO> queryProductSku(QueryProductSkuDTO queryProductSkuDTO);

    /** 管理后台查询商品列表
     * @author JustArgo 2020/5/27 20:51
     * @return
     */
    R<ProductPageVO> findAdminStoreProductList(AdminStoreProductDTO adminStoreProductDTO);

    /** 分页查询店铺下有商品的分组
     * @author JustArgo 2020/5/28 0:25
     * @return
     */
    R<ProductGroupListVO> findProductGroupList(ProductGroupQueryDTO productGroupQueryDTO);

    /** 新增根据分组查商品的接口
     * @author JustArgo 2020/5/28 21:06
     * @return
     */
    R<ProductPageVO> findProductListByGroupId(ProductListByGroupIdQueryDTO productListByGroupIdQueryDTO);

    /** 平台查询商品列表
     * @author JustArgo 2020/5/30 18:02
     * @return
     */
    R<AdminProductPageVO> findPlatformAdminProductList(AdminProductDTO dto);

    /**
     * @author JustArgo 2020/5/31 0:11
     * @return
     */
    R<CategoryProductCombineVO> findProductListByCategoryOrProductIdList(CategoryProductCombineDTO combineDTO);

    /** 搜索最近的N条搜索历史
     * @author JustArgo 2020/5/31 13:00
     * @return
     */
    R<List<SearchHistory>> findLastNSearchHistory(Long mid, int nCount);

    /** 删除搜索历史
     * @author JustArgo 2020/5/31 13:02
     * @return
     */
    R<Boolean> delSearchHistory(Long mid, String keyword);

    /** 更新商品的销量
     * @author 黄永宗 2020/6/6 17:56
     * @return
     */
	void updateSellCount(Map<Long, Integer> productSellCountMap);

	/** 查询店铺下的商品销量
	 * @author 善泉 2020/6/21 15:06
	 * @return
	 */
	Long getStoreProductSellCount(Long storeId);

    /**
     * 后台传商品id过来进行查询
     * @param productIds
     * @return
     */
    List<AdminProductVO> findAdminProductListByIds(List<Long> productIds);

    /**
     * 根据商品id查询商品，忽略商家编号
     * @param productId
     * @return
     */
    Product getByIdIgnoreTenant(Long productId);

    /**
     * 会员买商品的折扣和贡献值分配设置
     * @param dto
     * @return
     */
    R<Boolean> updateProductDiscContri(ProductDiscContriConfigUpdateDTO dto);

    /**
     * 贡献值设置
     * @param dto
     * @return
     */
    R<Boolean> updateProductContribution(ProductContributionConfigUpdateDTO dto);

}
